package com.example.notificationtest;

import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

import com.example.notificationtest.R;

import java.io.File;

/*
 **
 * 通知：
 * 可以在广播、activity或者service中去创建，不过在activity创建得比较少，一般都是应用在后台了，才需要去发送通知。
 * 创建通知的基本步骤如下：
 * 1、使用getSystemService拿到NotificationManager的管理类
 * 2、使用NotificationCompat设置标题、内容、图片等
 * 3、最后调用 NotificationManager的notify()显示通知
 * <p>
 * 而Android O之后引入了通知通道(Notification channel)
 * 重新定义通知内容中的应用程序类别，可以让开发者给予用户更精确的通知管理。用户可以阻止或分别更改每个通道的行为，而不是一起管理应用程序的所有通知。
 * <p>
 * 通知级别：
 * PRIORITY_DEFAULT默认的重要程度
 * PRIORITY_MIN表示最低的重要程度，系统可能只会在特定的场景才会显示这条通知
 * PRIORITY_LO表示较低的重要程度
 * PRIORITY_HIGH表示较高的重要程度，系统可能会将这类通知放大，或改变其显示顺序，比较靠前的位置
 * PRIORITY_MAX最高的重要程度，必须让用户立刻看到，甚至做出相应的操作。
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.send_notice).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 使用getSystemService拿到NotificationManager的管理类
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                // 通知对象
                Notification notification = null;
                Intent intent = new Intent(MainActivity.this, NotificationActivity.class);
                PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
                // 对Android版本的判断
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    String id = "channel_1";
                    String name = getString(R.string.app_name);
                    // 创建NotificationChannel对象，传入id，name和重要级别
                    NotificationChannel notificationchannel = new NotificationChannel(id,name,NotificationManager.IMPORTANCE_HIGH);
                    // 给manager创建通知的通道
                    manager.createNotificationChannel(notificationchannel);
                    // 使用NotificationCompat设置标题、内容、图片等
                    notification = new NotificationCompat.Builder(MainActivity.this, id)
                            // 指定通知的标题内容
//                            .setContentTitle("This is Tiyle!")
                            // 可以设置长文字信息、图片等
/*                            .setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to build "+
                                    "notifications, send and sync data, and use voice actions. Get the official"+
                                    "Android IDE and developer tools to build apps for Android."))*/
                 /*   通过 BitmapFactory的decodeResource() 方法将图片解析成Bitmap 对象，
                   再传入到bigPicture() 方法*/
                            .setStyle(new NotificationCompat.BigPictureStyle().bigPicture
                                    (BitmapFactory.decodeResource(getResources(), R.drawable.big_image)))
                            // 指定通知的正文内容
                            .setContentText("This is content text")
                            // 指定通知被创建的时间，以毫秒为单位，
                            .setWhen(System.currentTimeMillis())
                            // 设置通知的小图标，注意只能使用纯alpha图层的图片进行设置，小图标会显示在系统状态栏上.
                            .setSmallIcon(R.mipmap.ic_launcher)
                            // 设置通知的大图标，当下拉系统状态栏时，就可以看到设置的大图标权限
                            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                            .setContentIntent(pi)
                            .setAutoCancel(true)
                            // 设置通知声音
                          /*  .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
                            // 设置手机振动(需要设置声明权限)
                            .setVibrate(new long[] {0, 2000, 1000, 2000 })*/
                            // 会根据当前手机的环境来决定播放什么铃声，以及如何振动
                            .setDefaults(NotificationCompat.DEFAULT_ALL)
                            // 设置闪烁灯
                            .setLights(Color.GREEN, 1000, 1000)
                          /*  setPriority() 方法，它可以用于设置通知的重要程度:
                          PRIORITY_DEFAULT 表示默认的重要程度，和不设置效果是一样的；
                          PRIORITY_MIN表示最低的重要程度
                          PRIORITY_LOW 表示较低的重要程度
                          PRIORITY_HIGH 表示较高的重要程度
                          PRIORITY_MAX 表示最高高的重要程度
                          * */
                            // 在通知通道中是最高重要级别
                            .setPriority(NotificationCompat.PRIORITY_MAX)
                            .build();
                } else { //低版本
                    // 使用NotificationCompat设置标题、内容、图片等
                    notification = new NotificationCompat.Builder(MainActivity.this)
                            // 指定通知的标题内容
                            .setContentTitle("This is content title")
                            // 指定通知的正文内容
                            .setContentText("This is content text")
                            // 指定通知被创建的时间，以毫秒为单位，
                            .setWhen(System.currentTimeMillis())
                            // 设置通知的小图标，注意只能使用纯alpha图层的图片进行设置，小图标会显示在系统状态栏上.
                            .setSmallIcon(R.mipmap.ic_launcher)
                            // 设置通知的大图标，当下拉系统状态栏时，就可以看到设置的大图标
                            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                            .setContentIntent(pi)
                            .setAutoCancel(true)
                            .build();
                }
                // 显示通知
                manager.notify(1, notification);
            }
        });
    }

}